package com.test.java.watermark;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author TongRui乀
 * @date 2023-05-18
 */
public class WaterMarkUtil {

    public static long addWatermark(File input, File out, String text, int fontSize) {
        // 读取原图片
        long start = System.currentTimeMillis();
        BufferedImage image = null;
        try {
            image = ImageIO.read(input);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 获取图片的宽度和高度
        int width = image.getWidth();
        int height = image.getHeight();

        // 创建一个图片缓存对象
        BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 获取图片的画笔
        Graphics2D g = newImage.createGraphics();
        // 将原图片绘制到缓存图片上
        g.drawImage(image, 0, 0, width, height, null);

        // 创建字体对象
        Font font = new Font("微软雅黑", Font.PLAIN, fontSize);
        // 计算字符串的宽度和高度
        // 创建字体渲染上下文
        FontRenderContext frc = new FontRenderContext(null, true, true);
        // 计算字符串的宽度和高度
        Rectangle2D bounds = font.getStringBounds(text, frc);
        // 字符宽度
        int strWidth = (int) bounds.getWidth();
        // 字符高度
        int strHeight = (int) bounds.getHeight();

        int x= width - strWidth;
        int y= height ;
        // 设置水印的字体样式
        g.setFont(font);
        // 设置水印的颜色
        g.setColor(Color.lightGray);
        // 设置水印的位置 根据需要再自行调整宽度、高度
        g.drawString(text, x, y);
        // 释放图形上下文使用的系统资源
        g.dispose();
        long total = System.currentTimeMillis() - start;
        System.out.println("耗时：" + total);
        // 保存带水印的图片
        try {
            ImageIO.write(newImage, "png", out);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return total;
    }

    /**
     * 获取水印文字的长度
     * @param waterMarkContent
     * @param g
     * @return
     */
    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    public static void main(String[] args) {
        long total = 0;
        for (int i = 0; i < 100; i++) {
            long cost = addWatermark(new File("/Users/tongrui/Downloads/7.jpg"),
                    new File("/Users/tongrui/develop/tempfiles/watermark/深色灰字普通字体_"+i+".jpeg"), "四季为农", 24);
            total += cost;
        }
        System.out.println("平均耗时" + (total * 1.0f / 100));
    }

}
